联动加入redmine的wik
<?
php
error_reporting(E_ERROR);
date_default_timezone_set('Asia/Shanghai');
$red_server = "http://redmine.meilishuo.com/projects";
$project_name = "opupdate";
$wiki_name = "故障纪录";
$url = $red_server . "/$project_name/wiki/wiki.json";
create_wiki($url, "故障记录-" . date('Y-m'), $wiki_name, $message);
function create_wiki( $url, $title, $wiki_name, $message) {
$level = preg_split('/\//', $title);
for ( $i = 0; $i <= count($level); $i++) {
$suffix = ".json";
if ( $i == 0 ) {
$url = preg_replace('/wiki.*/i', "wiki/$wiki_name", $url);
}
if ( ! strstr($url, $suffix)) {
$url .= $suffix;
}
$page = get_page_content($url, "GET", "");
$org = json_decode( $page["content"] );
$org_content = $org->{'wiki_page'}->{'text'};
if ( 0 == $i ) {
$check_str = $wiki_name;
$parent = "Wiki";
} else {
$parent = $i == 1 ? $wiki_name : $level[($i-1)];
$check_str = $level[$i];
}
$check_result = strstr($org->{'wiki_page'}->{'text'}, $check_str);
if ( ! $check_result && 0 == $i ) {
$new_content = "h1. $check_str\r\n\r\nh2. [[$level[$i]]]";
} elseif ( count($level) == $i ) {
$new_content = "h3. " . strftime("%Y-%m-%d %H:%M:%S") . " : \r\n\r\n$message";
} elseif ( ! $check_result ) {
$last = $level[($i-1)];
$new_content = "h1. $last\r\n\r\nh2. [[$level[$i]]]";
}
$org_content .= "\r\n\r\n$new_content ";
$org->{'wiki_page'}->{'text'} = $org_content;
$org->{'wiki_page'}->{'parent_title'} = $parent;
$new = json_encode($org);
if ( isset($new_content) ) {
$response = get_page_content($url, "PUT", $new);
if ( 200 == $response['http_code']) {
print_r("Wiki : $url updated.\n$new\n");
} elseif ( 201 == $response['http_code']) {
print_r("Wiki : $url created.\n");
} else {
print_r("Failed to update wiki : $url\t" . $response['http_code'] . "\n");
}
}
$url = preg_replace('/wiki.*/i', "wiki/$level[$i]", $url);
}
}
$page = get_page_content($url, "GET", "");
$org = json_decode( $page["content"] );
if ( ! strstr($org->{'wiki_page'}->{'text'}, $wiki_name) ) {
$org_content = $org->{'wiki_page'}->{'text'};
$new_content = "* [[$wiki_name]]";
$org_content .= "\r\n\r\n$new_content ";
$org->{'wiki_page'}->{'text'} = $org_content;
$new = json_encode($org);
$response = get_page_content($url, "PUT", $new);
if ( 201 == $response['http_code']) {
printf("Wiki : $wiki_name created.\n");
}
}
function get_page_content( $url, $func, $curl_data ) {
$header = array(
"X-Redmine-API-Key: 5b01xxxxxxxddddddddddddddddddd",
"Content-Type: application/json"
);
$options = array(
CURLOPT_HTTPHEADER => $header,
CURLOPT_RETURNTRANSFER => true, // return web page
CURLOPT_HEADER => false, // don't return headers
CURLOPT_FOLLOWLOCATION => true, // follow redirects
CURLOPT_ENCODING => "", // handle all encodings
CURLOPT_USERAGENT => "Release Shell", // who am i
CURLOPT_AUTOREFERER => true, // set referer on redirect
CURLOPT_CONNECTTIMEOUT => 10, // timeout on connect
CURLOPT_TIMEOUT => 10, // timeout on response
CURLOPT_MAXREDIRS => 10, // stop after 10 redirects
CURLOPT_CUSTOMREQUEST => $func,
CURLOPT_VERBOSE => 0, //
CURLOPT_POSTFIELDS => $curl_data // this are my post vars
);
if ( "POST" == $func ) {
$post_opt = array(
CURLOPT_POST => 1, // i am sending post data
);
$options = array_merge($options, $post_opt);
}
$ch = curl_init($url);
curl_setopt_array($ch,$options);
$content = curl_exec($ch);
$err = curl_errno($ch);
$errmsg = curl_error($ch) ;
$header = curl_getinfo($ch);
curl_close($ch);
$header['content'] = $content;
$header['errmsg'] = $errmsg;
return $header;
}
联动加入redmine的wik的更多相关文章
- IDEA和JIRA任务联动(redmine同理)
IDEA和JIRA任务联动-操作流程详解 redmine和这个步骤类似,只是第一步选择的工具不一样 操作流程 添加jira配置,File->Setting-->tools-->Tas ...
- java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis
A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单; 技术:313596790freemaker模版技术 ,0个代码不用写 ...
- BPM配置故事之案例14-数据字典与数据联动
小明遇到了点麻烦,他昨天又收到了行政主管发来的邮件,要求把出差申请单改由H3 BPM进行,表单如下 行政主管的出差申请表 小明对表单进行了调整,设计出了一份适合在系统中使用的表单,但在"出差 ...
- iOS开发之"省市"二级联动的数据组织(PHP版)以及PickerView的实现与封装
之所以要发表这篇博客,还源于最近的开发工作所实现的一个小的Demo, 当然这个Demo不会涉及工作中App的一些内容,下方要实现的Demo是通用的.因为项目需求的迭代,要求在银行卡绑定中添加支行所在的 ...
- asp.net MVC4——省市三级联动
controller: public ActionResult GetCity(string id) { AreaService _areaSvc = new AreaService(); List& ...
- 解析ListView联动的实现--仿饿了么点餐界面
一.博客的由来 大神王丰蛋哥 之前一篇博客仿饿了点餐界面2个ListView联动(http://www.cnblogs.com/wangfengdange/p/5886064.html) 主要实现了2 ...
- bitnami redmine版本由2.3.1升级至3.2.2过程
环境: 操作系统为ubuntu13.**版本,非长期支持版. 安装目录:/opt/redmine-2.3.1-0/ 所有者用户:root 安装过程: 1. 备份2.3.1数据库 sudo /opt/r ...
- winform 用户控件、 动态创建添加控件、timer控件、控件联动
用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...
- 微信小程序-多级联动
微信小程序中的多级联动 这里用到的案例是城市选择器 先上代码: .wxml <view class="{{boxHide}}"> <view>{{nian} ...
随机推荐
- struts2运行过程(图解)
.................................................................................................... ...
- ueditor精简插件和减少初次加载文件的方法
ueditor初次使用的时候加载的文件大小大概有1MB还要多,这个页面的打开速度相对来说是很慢很慢的. 其实通常我们并不需要ueditor的全部功能,通过chromedev工具发现初次加载的时候就调用 ...
- 闲聊select和input常用的小插件
前言 在pc端的项目中,经常会用到表单标签,莫过于是select和input这两种,这两种相当常用.但往往原生的功能不尽人意,即使 input中type有n多属性,甚至连时间控件都有,但仍旧满足不了我 ...
- webpack学习笔记啊(幕课)
基础配置总结 webpack hello.js hello.bundle.js打包命令参数 --config filename : 指定其他名称做配置文件 --watch / -w : 监听文件改动, ...
- sql2012笔记
收缩数据库日志文件1.数据库右键-->Options-->Revovery model =Full 改成 Simple2.数据库右键-->Tasks-->Shrink--> ...
- 向TRichEdit插入图片的单元
很简单, 就3个函数, 直接看代码吧 unit RichEditBmp; { 2005-03-04 LiChengbin Added: Insert bitmap or gif into RichEd ...
- [S]SQL SERVER数据库维护与重建索引
第一步:查看是否需要维护,查看扫描密度/Scan Density是否为100% declare @table_id int set @table_id=object_id('表名') dbcc sho ...
- 从零一起学Spring Boot之LayIM项目长成记(五)websocket
前言 距离上一篇已经比较久的时间了,项目也是开了个头.并且,由于网上的关于Spring Boot的websocket讲解也比较多.于是我采用了另外的一个通讯框架 t-io 来实现LayIM中的通讯功能 ...
- ECMAScript6词法
ES6简介 ECMAScript 6.0(简称 ES6)是 JavaScript 语言的下一代标准,它于2015 年 6 月正式发布.ECMAScript 和 JavaScript 的关系是,前者是后 ...
- Java数据结构和算法(一)——简介
本系列博客我们将学习数据结构和算法,为什么要学习数据结构和算法,这里我举个简单的例子. 编程好比是一辆汽车,而数据结构和算法是汽车内部的变速箱.一个开车的人不懂变速箱的原理也是能开车的,同理一个不懂数 ...