Browse Source

implement apt-get source msg 'Please use: $vcs' for git

A bit unfair that only Bzr had this message. Lets at least print it for
git as well with the option of adding more later without string changes.
tags/debian/1.1.exp13
David Kalnischkies 6 years ago
parent
commit
7c4f1ca5fe
46 changed files with 101 additions and 113 deletions
  1. +13
    -21
      cmdline/apt-get.cc
  2. +1
    -2
      po/apt-all.pot
  3. +1
    -2
      po/ar.po
  4. +1
    -2
      po/ast.po
  5. +2
    -4
      po/bg.po
  6. +1
    -2
      po/bs.po
  7. +2
    -4
      po/ca.po
  8. +2
    -4
      po/cs.po
  9. +1
    -2
      po/cy.po
  10. +2
    -4
      po/da.po
  11. +2
    -4
      po/de.po
  12. +1
    -2
      po/dz.po
  13. +1
    -2
      po/el.po
  14. +2
    -4
      po/es.po
  15. +1
    -2
      po/eu.po
  16. +1
    -2
      po/fi.po
  17. +2
    -4
      po/fr.po
  18. +2
    -2
      po/gl.po
  19. +2
    -2
      po/hu.po
  20. +2
    -2
      po/it.po
  21. +2
    -2
      po/ja.po
  22. +1
    -1
      po/km.po
  23. +2
    -2
      po/ko.po
  24. +1
    -1
      po/ku.po
  25. +1
    -1
      po/lt.po
  26. +1
    -1
      po/mr.po
  27. +2
    -2
      po/nb.po
  28. +1
    -1
      po/ne.po
  29. +2
    -2
      po/nl.po
  30. +1
    -1
      po/nn.po
  31. +2
    -2
      po/pl.po
  32. +2
    -2
      po/pt.po
  33. +1
    -1
      po/pt_BR.po
  34. +1
    -1
      po/ro.po
  35. +2
    -2
      po/ru.po
  36. +2
    -2
      po/sk.po
  37. +2
    -2
      po/sl.po
  38. +2
    -2
      po/sv.po
  39. +2
    -2
      po/th.po
  40. +1
    -1
      po/tl.po
  41. +2
    -2
      po/tr.po
  42. +2
    -2
      po/uk.po
  43. +2
    -2
      po/vi.po
  44. +2
    -2
      po/zh_CN.po
  45. +1
    -1
      po/zh_TW.po
  46. +19
    -0
      test/integration/test-apt-get-source

+ 13
- 21
cmdline/apt-get.cc View File

@@ -78,7 +78,6 @@
#include <string.h>
#include <sys/ioctl.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <unistd.h>
#include <pwd.h>
#include <grp.h>
@@ -738,17 +737,22 @@ static bool DoSource(CommandLine &CmdL)
}
pos += vcs.length()+2;
string::size_type epos = srec.find("\n", pos);
string uri = srec.substr(pos,epos-pos).c_str();
string const uri = srec.substr(pos,epos-pos);
ioprintf(c1out, _("NOTICE: '%s' packaging is maintained in "
"the '%s' version control system at:\n"
"%s\n"),
Src.c_str(), vcs.c_str(), uri.c_str());
if(vcs == "Bzr")
ioprintf(c1out,_("Please use:\n"
"bzr branch %s\n"
"to retrieve the latest (possibly unreleased) "
"updates to the package.\n"),
uri.c_str());
std::string vcscmd;
if (vcs == "Bzr")
vcscmd = "bzr branch " + uri;
else if (vcs == "Git")
vcscmd = "git clone " + uri;

if (vcscmd.empty() == false)
ioprintf(c1out,_("Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) "
"updates to the package.\n"),
vcscmd.c_str());
break;
}

@@ -936,19 +940,7 @@ static bool DoSource(CommandLine &CmdL)
_exit(0);
}

// Wait for the subprocess
int Status = 0;
while (waitpid(Process,&Status,0) != Process)
{
if (errno == EINTR)
continue;
return _error->Errno("waitpid","Couldn't wait for subprocess");
}

if (WIFEXITED(Status) == 0 || WEXITSTATUS(Status) != 0)
return _error->Error(_("Child process failed"));
return true;
return ExecWait(Process, "dpkg-source");
}
/*}}}*/
// DoBuildDep - Install/removes packages to satisfy build dependencies /*{{{*/


+ 1
- 2
po/apt-all.pot View File

@@ -315,8 +315,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 1
- 2
po/ar.po View File

@@ -325,8 +325,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 1
- 2
po/ast.po View File

@@ -370,8 +370,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, fuzzy, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Por favor, usa:\n"


+ 2
- 4
po/bg.po View File

@@ -375,12 +375,10 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Използвайте:\n"
"bzr branch %s\n"
"Използвайте:\n%s\n"
"за да изтеглите последните промени в пакета (евентуално в процес на "
"разработка).\n"



+ 1
- 2
po/bs.po View File

@@ -331,8 +331,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 4
po/ca.po View File

@@ -376,12 +376,10 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Empreu:\n"
"bzr branch %s\n"
"Empreu:\n%s\n"
"per obtenir les últimes actualitzacions (possiblement no publicades) del "
"paquet.\n"



+ 2
- 4
po/cs.po View File

@@ -367,13 +367,11 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Pro stažení nejnovějších (možná dosud nevydaných) aktualizací balíku prosím "
"použijte:\n"
"bzr branch %s\n"
"použijte:\n%s\n"

#: cmdline/apt-get.cc:795
#, c-format


+ 1
- 2
po/cy.po View File

@@ -389,8 +389,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 4
po/da.po View File

@@ -378,12 +378,10 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Brug venligst:\n"
"bzr branch %s\n"
"Brug venligst:\n%s\n"
"for at hente de seneste (muligvis ikke udgivet) opdateringer til pakken.\n"

#: cmdline/apt-get.cc:795


+ 2
- 4
po/de.po View File

@@ -391,12 +391,10 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Bitte verwenden Sie:\n"
"bzr branch %s\n"
"Bitte verwenden Sie:\n%s\n"
"um die neuesten (möglicherweise noch unveröffentlichten) Aktualisierungen\n"
"für das Paket abzurufen.\n"



+ 1
- 2
po/dz.po View File

@@ -376,8 +376,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 1
- 2
po/el.po View File

@@ -385,8 +385,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 4
po/es.po View File

@@ -440,12 +440,10 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Utilice:\n"
"bzr branch %s\n"
"Utilice:\n%s\n"
"para obtener las últimas actualizaciones (posiblemente no publicadas aún) "
"del paquete.\n"



+ 1
- 2
po/eu.po View File

@@ -372,8 +372,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 1
- 2
po/fi.po View File

@@ -369,8 +369,7 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 4
po/fr.po View File

@@ -388,12 +388,10 @@ msgstr ""
#: cmdline/apt-get.cc:747
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"Please use:\n%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Veuillez utiliser la commande :\n"
"bzr branch %s\n"
"Veuillez utiliser la commande :\n%s\n"
"pour récupérer les dernières mises à jour (éventuellement non encore "
"publiées) du paquet.\n"



+ 2
- 2
po/gl.po View File

@@ -378,11 +378,11 @@ msgstr ""
#, fuzzy, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Empregue:\n"
"bzr get %s\n"
"%s\n"
"para obter as últimas actualizacións (posibelmente non publicadas) do "
"paquete.\n"



+ 2
- 2
po/hu.po View File

@@ -376,11 +376,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Használja a következő parancsot:\n"
"bzr branch %s\n"
"%s\n"
"a csomag legújabb (esetleg kiadatlan) frissítéseinek letöltéséhez.\n"

#: cmdline/apt-get.cc:795


+ 2
- 2
po/it.po View File

@@ -383,11 +383,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Utilizzare:\n"
"bzr branch %s\n"
"%s\n"
"per recuperare gli ultimi (forse non rilasciati) aggiornamenti del "
"pacchetto.\n"



+ 2
- 2
po/ja.po View File

@@ -379,12 +379,12 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"パッケージの最新の (まだリリースされていないかもしれない) 更新を取得するに"
"は、\n"
"bzr branch %s\n"
"%s\n"
"を使用してください。\n"

#: cmdline/apt-get.cc:795


+ 1
- 1
po/km.po View File

@@ -376,7 +376,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 2
po/ko.po View File

@@ -368,12 +368,12 @@ msgstr ""
#, fuzzy, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"패키지의 최근 (아마도 릴리스되지 않은) 업데이트를 받으려면\n"
"다음과 같이 하십시오:\n"
"bzr get %s\n"
"%s\n"

#: cmdline/apt-get.cc:795
#, c-format


+ 1
- 1
po/ku.po View File

@@ -337,7 +337,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 1
- 1
po/lt.po View File

@@ -337,7 +337,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 1
- 1
po/mr.po View File

@@ -370,7 +370,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 2
po/nb.po View File

@@ -377,11 +377,11 @@ msgstr ""
#, fuzzy, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Bruk:\n"
"bzr get %s\n"
"%s\n"
"for å hente siste (muligens ikke utgitte) oppdateringer for pakken.\n"

#: cmdline/apt-get.cc:795


+ 1
- 1
po/ne.po View File

@@ -373,7 +373,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 2
po/nl.po View File

@@ -389,11 +389,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Gebruik:\n"
"bzr branch %s\n"
"%s\n"
"om de nieuwste (mogelijk nog niet uitgebrachte) bijwerkingen van het pakket "
"op te halen.\n"



+ 1
- 1
po/nn.po View File

@@ -378,7 +378,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 2
po/pl.po View File

@@ -383,11 +383,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Proszę użyć:\n"
"bzr branch %s\n"
"%s\n"
"by pobrać najnowsze (prawdopodobnie jeszcze niewydane) poprawki tego "
"pakietu.\n"



+ 2
- 2
po/pt.po View File

@@ -376,11 +376,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Por favor utilize:\n"
"bzr branch %s\n"
"%s\n"
"para obter as últimas actualizações (possivelmente por lançar) ao pacote.\n"

#: cmdline/apt-get.cc:795


+ 1
- 1
po/pt_BR.po View File

@@ -378,7 +378,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 1
- 1
po/ro.po View File

@@ -375,7 +375,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 2
po/ru.po View File

@@ -383,11 +383,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Используйте:\n"
"bzr branch %s\n"
"%s\n"
"для получения последних (возможно не выпущенных) обновлений пакета.\n"

#: cmdline/apt-get.cc:795


+ 2
- 2
po/sk.po View File

@@ -375,11 +375,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Prosím, použite:\n"
"bzr branch %s\n"
"%s\n"
"ak chcete získať najnovšie (a pravdepodobne zatiaľ nevydané) aktualizácie "
"balíka.\n"



+ 2
- 2
po/sl.po View File

@@ -373,11 +373,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Uporabite:\n"
"bzr branch %s\n"
"%s\n"
"za pridobitev zadnjih (morda še neizdanih) posodobitev paketa.\n"

#: cmdline/apt-get.cc:795


+ 2
- 2
po/sv.po View File

@@ -379,11 +379,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Använd:\n"
"bzr branch %s\n"
"%s\n"
"för att hämta de senaste (möjligen inte utgivna) uppdateringarna av "
"paketet.\n"



+ 2
- 2
po/th.po View File

@@ -370,11 +370,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"กรุณาใช้:\n"
"bzr branch %s\n"
"%s\n"
"เพื่อดึงรุ่นล่าสุด (ที่อาจยังไม่ปล่อยออกมา) ของตัวแพกเกจ\n"

#: cmdline/apt-get.cc:795


+ 1
- 1
po/tl.po View File

@@ -378,7 +378,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 2
- 2
po/tr.po View File

@@ -382,12 +382,12 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Bu paketin en son (ve muhtemelen henüz yayımlanmamış olan)\n"
"sürümünü edinmek için lütfen:\n"
"bzr branch %s\n"
"%s\n"
"komutunu kullanın.\n"

#: cmdline/apt-get.cc:795


+ 2
- 2
po/uk.po View File

@@ -379,11 +379,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Будь-ласка використовуйте:\n"
"bzr branch %s\n"
"%s\n"
"щоб отримати найновіші (потенційно не випущені) оновлення до пакунку.\n"

#: cmdline/apt-get.cc:795


+ 2
- 2
po/vi.po View File

@@ -387,11 +387,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"Hãy dùng lệnh:\n"
"bzr branch %s\n"
"%s\n"
"để lấy các gói mới nhất (có thể là chưa phát hành).\n"

#: cmdline/apt-get.cc:795


+ 2
- 2
po/zh_CN.po View File

@@ -372,11 +372,11 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""
"请使用:\n"
"bzr branch %s\n"
"%s\n"
"获得该软件包的最近更新(可能尚未正式发布)。\n"

#: cmdline/apt-get.cc:795


+ 1
- 1
po/zh_TW.po View File

@@ -371,7 +371,7 @@ msgstr ""
#, c-format
msgid ""
"Please use:\n"
"bzr branch %s\n"
"%s\n"
"to retrieve the latest (possibly unreleased) updates to the package.\n"
msgstr ""



+ 19
- 0
test/integration/test-apt-get-source View File

@@ -27,6 +27,9 @@ insertsource 'stable' 'foo' 'all' '1.0'
insertsource 'wheezy' 'foo' 'all' '0.0.1'
insertsource 'wheezy' 'foo' 'all' '0.1'

insertsource 'stable' 'bar' 'any' '1.1' 'Vcs-Browser: https://anonscm.debian.org/cgit/bar/bar.git
Vcs-Git: git://anonscm.debian.org/bar/bar.git -b debian/experimental'

setupaptarchive

APTARCHIVE=$(readlink -f ./aptarchive)
@@ -42,6 +45,8 @@ DOWNLOAD2="Need to get 0 B/25 B of source archives.
'file://${APTARCHIVE}/foo_2.0.tar.gz' foo_2.0.tar.gz 14 SHA256:ca9b0b828ca22372502af2b80f61f0bd9063910ece9fc34eeaf9d9e31aa8195a"
testsuccessequal "$HEADER
$DOWNLOAD2" aptget source -q --print-uris foo
testsuccessequal "$HEADER
$DOWNLOAD2" aptget source -q --print-uris foo foo

# select by release: suite
testsuccessequal "$HEADER
@@ -93,3 +98,17 @@ $DOWNLOAD001" aptget source -q --print-uris -t unstable foo=0.0.1
testsuccessequal "$HEADER
Need to get 0 B/25 B of source archives.
Fetch source foo" aptget source -q -s foo

testfailureequal 'Reading package lists...
Building dependency tree...
E: Must specify at least one package to fetch source for' aptget source

testsuccessequal "Reading package lists...
Building dependency tree...
NOTICE: 'bar' packaging is maintained in the 'Git' version control system at:
git://anonscm.debian.org/bar/bar.git -b debian/experimental
Please use:
git clone git://anonscm.debian.org/bar/bar.git -b debian/experimental
to retrieve the latest (possibly unreleased) updates to the package.
Need to get 0 B/25 B of source archives.
Fetch source bar" aptget source bar -s

Loading…
Cancel
Save