File: [local] / misc / github_sync / github_sync.pl (download)
Revision 1.1, Sat Jun 13 22:42:13 2020 UTC (4 years ago) by afresh1
Branch: MAIN
CVS Tags: HEAD
Add the beginnings of a tool to sync my github account
For now it will be a one-way sync from GitHub to a "readonly" copy locally,
but someday I hope to swap and use my local copy as my primary and have it
sync changes to GitHub.
Main reason for perl, JSON handling.
|
#!/usr/bin/perl
# $AFresh1: github_sync.pl,v 1.1 2020/06/13 22:42:13 afresh1 Exp $
use utf8;
use v5.16;
use warnings;
use warnings FATAL => 'utf8';
use open qw< :std :encoding(UTF-8) >;
my $github_account = shift;
die "Usage: $0 github_account\n" unless $github_account;
my $repos_url = "https://api.github.com/users/$github_account/repos";
# Copyright (c) 2020 Andrew Hewus Fresh <andrew@afresh1.com>
#
# Permission to use, copy, modify, and distribute this software for any
# purpose with or without fee is hereby granted, provided that the above
# copyright notice and this permission notice appear in all copies.
#
# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
my $response = HTTP::Tiny::JSON->new->get($repos_url);
die "GET $repos_url: $response->{status}: $response->{reason}\n"
unless $response->{success};
foreach my $repo (@{ $response->{content} }) {
my $clone_url = $repo->{clone_url};
my $name = $clone_url =~ s{.*?\Q$github_account/}{}ir;
git( clone => '--bare', $clone_url )
unless -e $name;
local $ENV{GIT_DIR} = $name;
git(qw< fetch --prune-tags --tags >);
# TODO: Authentication and push of changes
#git(qw< push --all >);
}
sub git {
my (@args) = @_;
system('git', @args) == 0 or die "git @args failed: $?";
}
package HTTP::Tiny::JSON;
use parent 'HTTP::Tiny';
BEGIN { our $VERSION = v0.0.1 }
use JSON::PP;
sub request {
my ($self, @args) = @_;
my $response = $self->SUPER::request(@args);
return $response unless $response;
if ( $response->{headers}->{'content-type'}
=~ /^application\/json\b/i )
{
$response->{raw_content} = $response->{content};
$response->{content} = JSON::PP->new->utf8->decode(
$response->{content} );
}
return $response;
}
1;