diff --git a/.gitignore b/.gitignore index b74decb..57872d0 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1 @@ -/config.php +/vendor/ diff --git a/README.md b/README.md index 89f1c3c..4e5fde5 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,26 @@ +# GiteaBot Simple PHP library to interface with Gitea API -Designed to make a "Bot" for manipulating labels on issues. +Designed to make a "Bot" for manipulating labels and issues. -Usage example: [no_label_milestone.php](https://git.jhodges.co.uk/james/GiteaBot/src/branch/master/no_label_milestone.php) +For usage examples see https://git.jhodges.co.uk/james/GiteaBot-examples + +## Change Log + +v1.2 + +* Added namespacing and composer.json +* Moved usage example code to seperate repo +* Added support for add/delete comment + +V1.1.1 + +* Refactor, bootstrap, examples + +V1.1 + +* Refactor, better OO, examples + +v1.0 + +* Initial Prototype \ No newline at end of file diff --git a/bootstrap.php b/bootstrap.php deleted file mode 100644 index 1659c20..0000000 --- a/bootstrap.php +++ /dev/null @@ -1,4 +0,0 @@ -'', - 'user'=>'', - 'pass'=>'', -]; diff --git a/no_label_milestone.php b/no_label_milestone.php deleted file mode 100644 index b6865b6..0000000 --- a/no_label_milestone.php +++ /dev/null @@ -1,48 +0,0 @@ - [debug]\n"); -} -$debug = ($argc==4 && $argv[3]=='debug'); - -//open connection and repo -$client=new Client($config['url'],$config['user'],$config['pass'],$debug); -$repo=$client->getRepo($argv[1],$argv[2]); - -//get the labels of interest -$nolabelLabel=$repo->getLabelByName('no-label'); -if(!$nolabelLabel) die ("Can't find 'no-label' label in repo\n"); - -$nomilestoneLabel=$repo->getLabelByName('no-milestone'); -if(!$nomilestoneLabel) die ("Can't find 'no-milestone' label in repo\n"); - -//define the function to process each issue -$callback=function($issue) use ($nolabelLabel,$nomilestoneLabel){ - // do the no-label thing - $labelCount=count($issue->labels); - if($issue->hasLabel($nolabelLabel)) $labelCount--; //dont count the no-label label - if($nomilestoneLabel && $issue->hasLabel($nomilestoneLabel)) $labelCount--; //dont count the no-milestone label - if($labelCount==0 && !$issue->hasLabel($nolabelLabel) ){ - $issue->addLabel( $nolabelLabel ); - }elseif( $labelCount>0 && $issue->hasLabel($nolabelLabel) ){ - $issue->removeLabel( $nolabelLabel ); - } - //do the no-milestone thing - if( !$issue->milestone && !$issue->hasLabel($nomilestoneLabel) ){ - $issue->addLabel( $nomilestoneLabel ); - }elseif( $issue->milestone && $issue->hasLabel($nomilestoneLabel) ){ - $issue->removeLabel( $nomilestoneLabel ); - } -}; - -//loop through issues and call the callback -$repo->forIssues($callback); diff --git a/repeat.php b/repeat.php deleted file mode 100644 index 6aaf676..0000000 --- a/repeat.php +++ /dev/null @@ -1,114 +0,0 @@ - [debug]\n"); -} -$debug = ($argc==4 && $argv[3]=='debug'); - -//open connection and repo -$client=new Client($config['url'],$config['user'],$config['pass'],$debug); -$repo=$client->getRepo($argv[1],$argv[2]); - -$terms=[ - 'months'=>['janurary','feburary','march','april','may','june','july','august','september','october','november','december'], - 'days'=>['monday','tuesday','wednesday','thursday','friday','saturday','sunday'], - 'generic'=>['daily','weekly','fortnightly','monthly','yearly'] -]; - -/* create the labels */ -/* -foreach($terms as $k=>$vs){ - foreach($vs as $v){ - $label=$repo->getLabelByName($v); - if(!$label){ - $label=$repo->createLabel(['name'=>$new_name,'color'=>'#ffff00','description'=>'Reopen this issue with the given frequency']); - } - } -} -*/ - -//define the function to process each issue - -$daily=function($issue){ - $day_updated=date('d/m/Y',strtotime($issue->updated_at)); - $day_closed=date('d/m/Y',strtotime($issue->closed_at)); - $day_today=date('d/m/Y'); - echo "Daily: ". $issue->title." ".$issue->closed_at." ($day_closed, $day_today) \n"; - if($day_closed!=$day_today){ - if($issue->state=="closed"){ - $issue->state='open'; - $issue->save(); - }else{ - if($day_updated!=$day_today){ - $issue->addComment("NAG!"); - } - } - } -}; - -$monthly=function($issue) use ($terms){ - $month_closed=date('m/Y',strtotime($issue->closed_at)); - $month_today=date('m/Y'); - echo "Monthly: ".$issue->title." ".$issue->closed_at." ($month_closed, $month_today) \n"; - //print_r($issue->labels); - //print_r(getRepeatTerms($issue,$terms)); - //die(); - if($month_closed!=$month_today){ - $issue->state='open'; - $issue->save(); - } -}; - -$weekly=function($issue){ - $day_updated=date('z',strtotime($issue->updated_at)); - $day_closed=date('z',strtotime($issue->closed_at)); - $day_today=date('z'); - echo "Weekly: ". $issue->title." ".$issue->closed_at." ($day_closed, $day_today => ".(abs($day_closed-$day_today)).") \n"; - if( abs($day_closed-$day_today)>7 ){ - if($issue->state=="closed"){ - $issue->state='open'; - $issue->save(); - }else{ - if($day_updated!=$day_today){ - $issue->addComment("NAG!"); - } - } - } -}; - -$tmp=function($issue){ - //$hours_ago=(time()-strtotime($issue->closed_at))/60/60; -}; - -function getRepeatTerms($issue,$terms){ - $labels=[]; - $found=[]; - foreach($issue->labels as $label){ - $labels[]=$label->name; - } - print_r($labels); - foreach($terms as $name=>$values){ - foreach($values as $value){ - if( in_array("$value/repeat",$labels) ){ - $found[$name][]=$value; - } - } - } - return $found; -} - -//loop through issues and call the callback -$day_name=strtolower(date('l')); -$month_name=strtolower(date('F')); - -//$repo->forIssues($daily,['state'=>'open','labels'=>'daily/repeat']); -//die(); -$repo->forIssues($weekly,['state'=>'closed','labels'=>'weekly/repeat']); -$repo->forIssues($daily,['state'=>'closed','labels'=>'daily/repeat']); -$repo->forIssues($daily,['state'=>'closed','labels'=>$day_name.'/repeat']); -$repo->forIssues($monthly,['state'=>'closed','labels'=>'monthly/repeat']); -$repo->forIssues($monthly,['state'=>'closed','labels'=>$month_name.'/repeat']); diff --git a/src/Client.php b/src/Client.php index 27061fc..bd8cb09 100644 --- a/src/Client.php +++ b/src/Client.php @@ -1,4 +1,6 @@ user.':'.$this->pass); } - $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); $result = curl_exec($ch); + $status_code = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); - return json_decode($result); + + if(in_array($status_code,[200,201,204])){ + return json_decode($result); + }else{ + throw new \Exception("API $status_code Code: ".$result); + } } } diff --git a/src/GiteaData.php b/src/GiteaData.php index 254c608..ace985b 100644 --- a/src/GiteaData.php +++ b/src/GiteaData.php @@ -1,4 +1,6 @@ request($this->url.'/comments','POST',$args); } + public function getComments(){ + return $this->request($this->url.'/comments','GET'); + } + public function hasLabel($label){ $id=$label->id; foreach($this->labels as $label){ diff --git a/src/Label.php b/src/Label.php index 72aa97c..107ec6f 100644 --- a/src/Label.php +++ b/src/Label.php @@ -1,4 +1,6 @@ client=$client; $this->user=$user; @@ -30,8 +34,11 @@ class Repo{ public function getLabelByName($name){ $url="repos/{$this->user}/{$this->repo}/labels"; - $data=$this->client->request($url); - foreach($data as $datum){ + if(!isset($this->cache['lables'])){ + $this->cache['lables']=$this->client->request($url); + } + + foreach($this->cache['lables'] as $datum){ if($datum->name==$name){ $datum->url=$url."/".$datum->id; // not set by api for some reason (bug?) return new Label($this,$datum); @@ -47,6 +54,15 @@ class Repo{ return new Label($this,$data); } + public function deleteLabel($label){ + $data=$this->client->request($label->url,'DELETE'); + } + + public function deleteComment($comment){ + $url="repos/{$this->user}/{$this->repo}/issues/comments/{$comment->id}"; + $data=$this->client->request($url,'DELETE'); + } + public function createIssue($args){ $url="repos/{$this->user}/{$this->repo}/issues"; $data=$this->client->request($url,'POST',$args);