<?

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的更多相关文章

  1. IDEA和JIRA任务联动(redmine同理)

    IDEA和JIRA任务联动-操作流程详解 redmine和这个步骤类似,只是第一步选择的工具不一样 操作流程 添加jira配置,File->Setting-->tools-->Tas ...

  2. java springMVC SSM 操作日志 4级别联动 文件管理 头像编辑 shiro redis

    A 调用摄像头拍照,自定义裁剪编辑头像 B 集成代码生成器 [正反双向](单表.主表.明细表.树形表,开发利器)+快速构建表单;  技术:313596790freemaker模版技术 ,0个代码不用写 ...

  3. BPM配置故事之案例14-数据字典与数据联动

    小明遇到了点麻烦,他昨天又收到了行政主管发来的邮件,要求把出差申请单改由H3 BPM进行,表单如下 行政主管的出差申请表 小明对表单进行了调整,设计出了一份适合在系统中使用的表单,但在"出差 ...

  4. iOS开发之"省市"二级联动的数据组织(PHP版)以及PickerView的实现与封装

    之所以要发表这篇博客,还源于最近的开发工作所实现的一个小的Demo, 当然这个Demo不会涉及工作中App的一些内容,下方要实现的Demo是通用的.因为项目需求的迭代,要求在银行卡绑定中添加支行所在的 ...

  5. asp.net MVC4——省市三级联动

    controller: public ActionResult GetCity(string id) { AreaService _areaSvc = new AreaService(); List& ...

  6. 解析ListView联动的实现--仿饿了么点餐界面

    一.博客的由来 大神王丰蛋哥 之前一篇博客仿饿了点餐界面2个ListView联动(http://www.cnblogs.com/wangfengdange/p/5886064.html) 主要实现了2 ...

  7. bitnami redmine版本由2.3.1升级至3.2.2过程

    环境: 操作系统为ubuntu13.**版本,非长期支持版. 安装目录:/opt/redmine-2.3.1-0/ 所有者用户:root 安装过程: 1. 备份2.3.1数据库 sudo /opt/r ...

  8. winform 用户控件、 动态创建添加控件、timer控件、控件联动

    用户控件: 相当于自定义的一个panel 里面可以放各种其他控件,并可以在后台一下调用整个此自定义控件. 使用方法:在项目上右键.添加.用户控件,之后用户控件的编辑与普通容器控件类似.如果要在后台往窗 ...

  9. 微信小程序-多级联动

    微信小程序中的多级联动 这里用到的案例是城市选择器 先上代码: .wxml <view class="{{boxHide}}"> <view>{{nian} ...

随机推荐

  1. Python基础-注释-变量赋值

    一.注释 # 注释 \n 行分隔符 \ 继续上一行 '''   *** ''' 多行注释 二.基本规则 : 分开代码块(组)   头$尾 缩进块  语句代码块  用缩进深度区分 空行     用于分割 ...

  2. BZOJ-2330-[SCOI2011]糖果(差分约束)

    Description 幼儿园里有N个小朋友,lxhgww老师现在想要给这些小朋友们分配糖果,要求每个小朋友都要分到糖果.但是小朋友们也有嫉妒心,总是会提出一些要求,比如小明不希望小红分到的糖果比他的 ...

  3. 初学者最易懂的git教程在这里!

    一.git简介: Linux创建了Linux,但是Linux的发展壮大是由世界各地的热心志愿者参与编写的?那么那么多份的代码是怎么合并的呢?之前是在2002年以前,世界各地的志愿者把源代码文件通过di ...

  4. C#使用Oracle.ManagedDataAccess.dll

    在刚接触C#的时候由于公司使用的就是Oracle数据库,那么C#怎么连接Oracle数据库就成了首要去掌握的知识点了.在那时没有ODP.NET,但visual studio却对Oralce数据库的调用 ...

  5. 浅谈字体小图标font awesome,iconfont,svg各自优缺点

    三种都是矢量图(即放大不失真),但是个自又有个自的优缺点, 1.font awesome: 优点:相对比较简单,查看官网看例子基本上都会用 (http://www.bootcss.com/p/font ...

  6. 【2】hadoop搭建准备软件

    准备一:VMware虚拟工具: 链接:http://pan.baidu.com/s/1o7F4A6I 密码:w5ti 准备二:CentOS6.8虚拟机(64位):如果64位不允许安装,可能是电脑设置问 ...

  7. Python程序员去上海工作有多难?

    我只能说,也要看你掌握的技术可以打多少分.技术熟练度跟找工作的难易程度是成正比的:你掌握得越好,找工作就越容易(难度系数越低):反之越高. Python程序员这种技术类的工作岗位,当然还是要有扎实的技 ...

  8. 100000个嵌入式学习者遇到的PING不通问题,我们使用这一个视频就解决了,牛!

    在10多年的售后答疑历程中,我们每天都会遇到开发板.windows,ubuntu三者之间的PING通问题,常常中断手头中的工作去解决这类问题,甚至跟客户远程协助,颇耗时间与精力,在热心网友.答疑助手们 ...

  9. Vocabulary & Phrase

    Vocabulary A ANSI    美国国家标准学会,American National Standards Institute的缩写 a couple of    [口语]少数的,几个 a s ...

  10. MySQL GTIDs(global transaction identifiers)

    1.如何定义和生成GTIDs 唯一性:在所有主从库都是唯一的,由二元组构成 每个事务和GTIDs之间都有1:1映射 GTID = source_id:transaction_id source_id标 ...