7 Commits

Author SHA1 Message Date
c78f9a36d9 Bump version to v1.1 2024-05-25 18:39:51 +02:00
5fd6da816f Add contribution guide in README. 2024-05-25 18:39:07 +02:00
d9d807b754 Correct name of GNU Make in README. 2024-05-25 18:29:27 +02:00
7c5f748791 Remove pacundo binary from gitignore.
No longer exists.
2024-05-25 18:28:38 +02:00
2bda4e6d7c Makefile: Fix install target. 2024-05-25 18:27:18 +02:00
795a06f4be Implement download from ArchLinux Archive. 2024-05-25 18:24:41 +02:00
e9e2737bd4 Silence ls errors.
It is expected behavior that sometimes the local file will not be found.
2024-05-25 18:17:47 +02:00
5 changed files with 72 additions and 11 deletions

1
.gitignore vendored
View File

@ -1,2 +1 @@
pacundo
pacundo.1.gz pacundo.1.gz

View File

@ -34,7 +34,7 @@ clean:
doc: pacundo.1.gz doc: pacundo.1.gz
install: pacundo pacundo.1.gz install: pacundo.1.gz
install -d $(PREFIX)/bin install -d $(PREFIX)/bin
install -m 755 pacundo.pl $(PREFIX)/bin/pacundo install -m 755 pacundo.pl $(PREFIX)/bin/pacundo
install -d $(PREFIX)/share/man/man1 install -d $(PREFIX)/share/man/man1

View File

@ -11,12 +11,13 @@ to boot from a USB depending on just how broken it is).
- Perl 5 - Perl 5
- `File::ReadBackwards` module - `File::ReadBackwards` module
- GNU Makefile - cURL
- GNU Make
You can install these packages with the following command: You can install these packages with the following command:
```console ```console
# pacman -S perl perl-file-readbackwards # pacman -S perl perl-file-readbackwards curl
``` ```
### Compiling & Installing ### Compiling & Installing
@ -48,6 +49,26 @@ Look at the man-page (`man pacundo`) for more information.
- [yay](https://github.com/Jguer/yay) - [yay](https://github.com/Jguer/yay)
## Contributing
If you find any issues, feel free to report them on GitHub or send me an E-Mail
(see my website/profile for the address). I will add these issues to my personal
Gitea page and (unless specified otherwise) mention you as the person who found
the issue.
For patches/pull requests, if you open a PR on GitHub I will likely not merge
directly but instead apply the patches locally (via Git patches, conserving
authorship), push them to my Gitea repository, which will finally be mirrored to
GitHub. However, you can save me a bit of work by just sending me the Git
patches directly (via E-Mail).
If you're looking for a way to contribute, there are a few to-do items within
the code which you can find using `grep`:
```console
# grep -n "TODO" pacundo.pl
```
## License ## License
This project is licensed under the terms & conditions of the Zlib license. This project is licensed under the terms & conditions of the Zlib license.

View File

@ -1,4 +1,4 @@
.TH PACUNDO "1" "April 2024" "pacundo 1.0.1" "User Commands" .TH PACUNDO "1" "April 2024" "pacundo 1.1" "User Commands"
.SH "NAME" .SH "NAME"
pacundo - A time machine to roll back your ArchLinux machine to a working state. pacundo - A time machine to roll back your ArchLinux machine to a working state.
.SH "SYNOPSIS" .SH "SYNOPSIS"

View File

@ -29,7 +29,7 @@ use feature qw(signatures);
use Getopt::Std; use Getopt::Std;
use File::ReadBackwards; use File::ReadBackwards;
my $VERSION = '1.0.1'; my $VERSION = '1.1';
my $PROG_NAME = 'pacundo'; my $PROG_NAME = 'pacundo';
sub print_version() { sub print_version() {
@ -183,6 +183,7 @@ sub find_local_pkg($pkgmgr, $pkg_name, $pkg_ver='') {
my $pkg_file = ''; my $pkg_file = '';
my $pkg_pat; my $pkg_pat;
my $repo = `$pkgmgr->{info} $pkg_name | awk '{ if (\$1 == "Repository") print \$3; }'`;; my $repo = `$pkgmgr->{info} $pkg_name | awk '{ if (\$1 == "Repository") print \$3; }'`;;
chomp($repo);
if ($pkg_ver ne '') { if ($pkg_ver ne '') {
$pkg_pat = "$pkg_name-$pkg_ver-*.pkg.tar.zst"; $pkg_pat = "$pkg_name-$pkg_ver-*.pkg.tar.zst";
@ -199,9 +200,9 @@ sub find_local_pkg($pkgmgr, $pkg_name, $pkg_ver='') {
return ''; return '';
} }
$pkg_file = `ls $aur_dir/$pkg_pat | tail -n1`; $pkg_file = `ls $aur_dir/$pkg_pat 2> /dev/null | tail -n1`;
} else { } else {
$pkg_file = `ls /var/cache/pacman/pkg/$pkg_pat | tail -n1`; $pkg_file = `ls /var/cache/pacman/pkg/$pkg_pat 2> /dev/null | tail -n1`;
} }
chomp($pkg_file); chomp($pkg_file);
@ -209,6 +210,44 @@ sub find_local_pkg($pkgmgr, $pkg_name, $pkg_ver='') {
return $pkg_file; return $pkg_file;
} }
sub find_remote_archive($pkgmgr, $pkg_name, $pkg_ver) {
my $repo = `$pkgmgr->{info} $pkg_name | awk '{ if (\$1 == "Repository") print \$3; }'`;;
chomp($repo);
# TODO: look through git history for version.
if ($repo eq 'aur') {
return '';
}
# TODO: Probably a better way of managing architectures. There should be a
# way of getting the architecture of the package.
my @archs = (`uname -m`, 'any');
my $ala_url = "https://archive.archlinux.org/packages/" .
substr($pkg_name,0,1) . "/" . $pkg_name;
my $pkg_file = '';
foreach my $arch (@archs) {
chomp($arch);
my $filename = "$pkg_name-$pkg_ver-$arch.pkg.tar.zst";
my $pkg_url = "$ala_url/$filename";
my $output_file = "/tmp/$filename";
my $resp = `curl -Lo $output_file -s -w '%{http_code}\n' $pkg_url`;
chomp($resp);
if ($resp eq '200') {
system("curl -Lo $output_file.sig -s $pkg_url.sig");
$pkg_file = $output_file;
last;
} else {
unlink $output_file;
}
}
if ($pkg_file ne '') {
print("Downloaded from archive: $pkg_file\n");
}
return $pkg_file;
}
getopts("irt:dvh", \my %opts); getopts("irt:dvh", \my %opts);
if ($opts{'v'}) { if ($opts{'v'}) {
@ -252,10 +291,12 @@ foreach my $tx (@undo_txs) {
} }
} else { } else {
my $pkg_file = &find_local_pkg($pkgmgr, $tx->{pkg_name}, $tx->{oldver}); my $pkg_file = &find_local_pkg($pkgmgr, $tx->{pkg_name}, $tx->{oldver});
if ($pkg_file eq '') { $pkg_file = &find_remote_archive($pkgmgr, $tx->{pkg_name}, $tx->{oldver}) if ($pkg_file eq '');
$remote_install_pkgs .= "$tx->{pkg_name} ";
} else { if ($pkg_file ne '') {
$local_install_pkgs .= "$pkg_file "; $local_install_pkgs .= "$pkg_file ";
} else {
print(STDERR "Unable to find $tx->{pkg_name} $tx->{pkg_ver}");
} }
} }
} }