source: lab.git/Dev/github/GitHubBackup.pm @ 19233f5

Last change on this file since 19233f5 was 19233f5, checked in by Ken-ichi Mito <mitty@…>, 11 years ago

GitHubBackup module for backup github project

  • work in progress
  • done with GitHubBackup::Repository->clone_git()
  • Property mode set to 100644
File size: 2.8 KB
Line 
1package utils;
2use strict;
3use warnings;
4use utf8;
5use Carp qw(croak);
6
7use LWP::UserAgent;
8use JSON;
9my $ua = LWP::UserAgent->new;
10my $json = JSON->new->utf8->indent;
11
12sub json_api {
13    my $url = shift;
14   
15    my $res = $ua->get(
16        "https://api.github.com$url"
17    );
18   
19    $res->is_success or croak $res->status_line;
20   
21    return $json->decode($res->content);
22}
23
24
25package GitHubBackup;
26use base qw(Class::Accessor::Fast);
27
28use strict;
29use warnings;
30use utf8;
31use Carp qw(croak);
32
33__PACKAGE__->mk_accessors( qw(
34    directory
35    account
36    repository
37));
38
39
40# both hash and hashref are acceptable
41sub new {
42    my $class = shift;
43   
44    my $args = (ref $_[0] eq 'HASH') ? $_[0] : {@_};
45    if (! $args->{directory}) {
46        $args->{directory} = ".";
47    }
48   
49    return $class->SUPER::new($args);
50}
51
52sub repos {
53    my $self = shift;
54    return $self->{repos} if ($self->{repos});
55   
56    my $account = $self->account or croak "account is not set";
57    if (my $repository = $self->repository) {
58        $self->{repos} = [
59            GitHubBackup::Repository->new({
60                __super   => $self,
61                full_name => "$account/$repository",
62            })
63        ];
64       
65        return $self->{repos};
66    }
67   
68    my $page = 1;
69    my @repos;
70    while (1) {
71        my $result = utils::json_api("/users/$account/repos?per_page=100&page=$page");
72        if (ref($result) eq 'ARRAY' && scalar @$result > 0) {
73            push @repos, @$result;
74            $page++;
75           
76            next;
77        }
78        last;
79    }
80   
81    foreach my $repos (@repos) {
82        push @{$self->{repos}},
83            GitHubBackup::Repository->new({
84                __super   => $self,
85                full_name => $repos->{full_name},
86                clone_url => $repos->{clone_url},
87            })
88        ;
89    }
90   
91    return $self->{repos};
92}
93
94
95package GitHubBackup::Repository;
96use base qw(Class::Accessor::Fast);
97
98use strict;
99use warnings;
100use utf8;
101use Carp qw(croak);
102use Git::Repository;
103use File::chdir;
104
105sub new {
106    my $class = shift;
107    my $args  = shift;
108   
109    if (! exists $args->{clone_url}) {
110        my $result = utils::json_api('/repos/' . $args->{full_name});
111        $args->{clone_url} = $result->{clone_url};
112    }
113   
114    return $class->SUPER::new($args);
115}
116
117sub clone_git {
118    my $self = shift;
119   
120    my $dir = $self->{__super}->directory .'/'. $self->{full_name};
121    if (-d "$dir") {
122        local $CWD = $dir;
123        print "fetch ", $self->{full_name}, "\n";
124        Git::Repository->run(fetch => '--all');
125        return $self;
126    }
127   
128    print "clone ", $self->{full_name}, "\n";
129    Git::Repository->run(clone => '--mirror' => $self->{clone_url} => $dir);
130    return $self;
131}
132
133sub set_forks {
134    my $self = shift;
135}
136
137sub clone_wiki {
138    my $self = shift;
139}
140
141sub save_issues {
142    my $self = shift;
143}
144
145
146
1471;
148__END__
Note: See TracBrowser for help on using the repository browser.