GitHub-Crud
view release on metacpan or search on metacpan
lib/GitHub/Crud.pm view on Meta::CPAN
name => undef,
path => undef,
self => undef,
sha => undef,
size => undef,
type => undef,
url => undef,
);
sub getSha($) #P Compute L<sha> for data after encoding any unicode characters as utf8.
{my ($data) = @_; # String possibly containing non ascii code points
my $length = length($data);
my $blob = 'blob' . " $length\0" . $data;
utf8::encode($blob);
my $r = eval{sha1_hex($blob)};
confess $@ if $@;
$r
}
if (0) # Test L<sha>
{my $sha = getSha("<h1>Hello World</h1>\n");
my $Sha = "f3e333e80d224c631f2ff51b9b9f7189ad349c15";
unless($sha eq $Sha)
{confess "Wrong SHA: $sha".
"Should be: $Sha";
}
confess "getSha success";
}
sub shaKey($;$) #P Add a L<SHA> key to a L<url>
{my ($gitHub, $fileData) = @_; # Github, optional fileData to specify the file to use if it is not gitFile
filePath($gitHub->repository,
$fileData ? ($fileData->path, $fileData->name) : $gitHub->gitFile)
}
sub saveSha($$) #P Save the L<sha> of a file
{my ($gitHub, $fileData) = @_; # Github, file details returned by list or exists
$shas{$gitHub->shaKey($fileData)} = $fileData->sha;
}
sub copySha($) #P Save the L<sha> of a file just read to a file just about to be written
{my ($gitHub) = @_; # Github
$shas{$gitHub->shaKey} = $gitHub->response->data->sha;
}
sub getExistingSha($) #P Get the L<sha> of a file that already exists
{my ($gitHub) = @_; # Github
my $s = $shas{$gitHub->shaKey}; # Get the L<sha> from the cache
return $s if defined $s; # A special L<sha> of 0 means the file was deleted
my $r = $gitHub->exists; # Get the L<sha> of the file via exists if the file exists
return $r->sha if $r; # L<sha> of existing file
undef # Undef if no such file
}
sub deleteSha($) #P Delete a L<sha> that is no longer valid
{my ($gitHub) = @_; # Github
$shas{$gitHub->shaKey} = undef # Mark the L<sha> as deleted
}
sub qm($) #P Quotemeta extended to include undef
{my ($s) = @_; # String to quote
return '' unless $s;
$s =~ s((\'|\"|\\)) (\\$1)gs;
$s =~ s(\s) (%20)gsr; # Url encode blanks
}
sub patKey($) #P Create an authorization header by locating an appropriate personal access token
{my ($gitHub) = @_; # GitHub
$gitHub->loadPersonalAccessToken unless $gitHub->personalAccessToken; # Load a personal access token if none has been supplied
if (my $pat = $gitHub->personalAccessToken) # User supplied personal access token explicitly
{return "-H \"Authorization: token $pat\""
}
confess "Personal access token required with scope \"public_repo\"". # We must have a personal access token to do anything useful!
" as generated on page:\nhttps://github.com/settings/tokens";
}
sub refOrBranch($$) #P Add a ref or branch keyword
{my ($gitHub, $ref) = @_; # Github, whether to use ref rather than branch
my $b = $gitHub->branch;
return "?ref=$b" if $ref and $b;
return "?branch=$b" if !$ref and $b;
''
}
sub gitHub(%) #P Create a test L<GitHub> object
{my (%options) = @_; # Options
GitHub::Crud::new
(userid => q(philiprbrenan),
repository => q(aaa),
confessOnFailure => 1,
@_);
}
#D1 Constructor # Create a L<github> object with the specified attributes describing the interface with L<github>.
sub new(@) # Create a new L<GitHub> object with attributes as described at: L<GitHub::Crud Definition>.
{my (%attributes) = @_; # Attribute values
my $curl = qx(curl -V); # Check Curl
if ($curl =~ /command not found/)
{confess "Command curl not found"
}
my $g = genHash(__PACKAGE__, # Attributes describing the interface with L<github>.
body => undef, #I The body of an issue.
branch => undef, #I Branch name (you should create this branch first) or omit it for the default branch which is usually 'master'.
confessOnFailure => undef, #I Confess to any failures
failed => undef, # Defined if the last request to L<GitHub> failed else B<undef>.
fileList => undef, # Reference to an array of files produced by L<list|/list>.
gitFile => undef, #I File name on L<GitHub> - this name can contain '/'. This is the file to be read from, written to, copied from, checked for existence or deleted.
gitFolder => undef, #I Folder name on L<GitHub> - this name can contain '/'.
message => undef, #I Optional commit message
nonRecursive => undef, #I Fetch only one level of files with L<list>.
personalAccessToken => undef, #I A personal access token with scope "public_repo" as generated on page: https://github.com/settings/tokens.
personalAccessTokenFolder => accessFolder, #I The folder into which to save personal access tokens. Set to q(/etc/GitHubCrudPersonalAccessToken) by default.
private => undef, #I Whether the repository being created should be private or not.
readData => undef, # Data produced by L<read|/read>.
( run in 1.824 second using v1.01-cache-2.11-cpan-364913b4093 )